package org.rslai.util.imageprocess.position;

import java.awt.AWTException;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import org.rslai.util.number.Math;

public class SpecifiedRegion {
	private boolean isIdentified[][]; // 保存已经判断过的坐标

	public SpecifiedRegion() {
		Dimension dimension = this.getScreenSize();
		this.isIdentified = new boolean[dimension.width][dimension.height];
	}

	/**
	 * 获取屏幕大小
	 * @return 屏幕大小，以像素为单位
	 */
	public Dimension getScreenSize() {
		return Toolkit.getDefaultToolkit().getScreenSize();
	}

	/**
	 * 从指定坐标判断是否为指定颜色的区块，如果是返回区块的位置及大小信息
	 * @param img BufferedImage 对象
	 * @param color 要查找的颜色
	 * @param borderWidth 边框的宽度
	 * @param pointX 当前坐标 x
	 * @param pointY 当前坐标 y
	 * @param totalX 剩余要查找的宽度
	 * @param totalY 剩余要查找的高度
	 * @return 区块的位置及大小信息
	 */
	private Area isAreaInfo(BufferedImage img, Color color, int borderWidth, int pointX, int pointY, int totalX, int totalY) {
		int width = 0;
		int height = 0;

		// 按照高度 borderWidth 查找区块的宽度
		breakWidth:
		for (int x=pointX; x<=totalX; x++) {
			for (int y=pointY; y<pointY+borderWidth; y++) {
				if (img.getRGB(x, y) != color.getRGB()) {
					break breakWidth;
				}
			}
			width++;
		}

		// 按照宽度 borderWidth 查找区块的高度
		breakHeight:
		for (int y=pointY; y<=totalY; y++) {
			for (int x=pointX; x<pointX+borderWidth; x++) {
				if (img.getRGB(x, y) != color.getRGB()) {
					break breakHeight;
				}
			}
			height++;
		}

		// 判断过标记一下
		for (int x=pointX; x<pointX+width; x++) {
			for (int y=pointY; y<pointY+height; y++) {
				isIdentified[x][y] = true;
			}
		}

		// 判断指定颜色区块，是个框还是个实心色块
		if (width>borderWidth*2 && height>borderWidth*2) {
			int verifyError = 0;
			for (int i=0; i<10; i++) {
				// 产生随机数，然后取值比较
				int verifyX = pointX + borderWidth + Math.getInstance().randomInt(width-borderWidth*2);
				int verifyY = pointY + borderWidth + Math.getInstance().randomInt(height-borderWidth*2);
				if (img.getRGB(verifyX, verifyY) == color.getRGB()) {
					verifyError++;
					if (verifyError > 5) {
						return null;
					}
				}
			}
		} else {
			return null;
		}

		return new Area(pointX, pointY, width, height);
	}

	/**
	 * 返回指定颜色边框在图片上的位置及大小信息
	 * @param picFile 图片文件路径+文件名
	 * @param color 要查找的颜色
	 * @param borderWidth 边框的宽度
	 * @throws IOException 
	 */
	public Area getSpecifiedRegion(String picFile, Color color, int borderWidth) throws IOException {
		BufferedImage img = ImageIO.read(new File(picFile));
		int width = img.getWidth();
		int height = img.getHeight();

		for (int x=0; x<width; x++) {
			for (int y=0; y <height; y++) {
				if (!isIdentified[x][y] && img.getRGB(x, y)==color.getRGB()) {
					Area findArea = this.isAreaInfo(img, color, borderWidth, x, y, width, height);
					if (findArea != null) {
						return findArea;
					}
				}
				isIdentified[x][y] = true; // 判断过标记一下
			}
		}
		return null;
	}

	/**
	 * 返回指定颜色边框在屏幕上的位置及大小信息
	 * @param color 要查找的颜色
	 * @param borderWidth 边框的宽度
	 * @return 边框的位置及大小信息
	 * @throws AWTException
	 * @throws IOException 
	 */
	public Area getSpecifiedRegion(Color color, int borderWidth) throws AWTException, IOException {
		// 保存屏幕截图
		org.rslai.util.io.File.getInstance().mkdirs("tmp");
		Robot robot;
		robot = new Robot();
		Dimension screenSize = getScreenSize();
		BufferedImage img = robot.createScreenCapture(new Rectangle(0, 0, screenSize.width, screenSize.height));
		ImageIO.write(img, "png", new File("tmp/specifiedRegion.png"));

		return getSpecifiedRegion("tmp/specifiedRegion.png", color, borderWidth);
	}

}
